home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / vbdb / dbaccess.bas < prev    next >
BASIC Source File  |  1995-09-06  |  16KB  |  600 lines

  1. '
  2. 'VBDB version 1.0 for Visual Basic 1.0 and Windows 3.0
  3. '(C)1991 Marquis Computing. All Rights Reserved.
  4. '
  5. 'Client interface module for VBDB version 1.10.
  6. '
  7.  
  8. DefInt A-Z
  9.  
  10. Dim DBA_Data  As String
  11. Dim DBA_Mesg  As String
  12. Dim DBA_Stat  As Integer
  13. Dim ClientID As String
  14.  
  15. Const True = -1
  16. Const False = 0
  17.  
  18. Sub StatusDBF (Handle, FileName$, dbftype$, DBTPtr, NumRecs&, NumFlds, RecLen, UpDate$, Status)
  19.  
  20.     '
  21.     'Returns information about a database
  22.     '
  23.     
  24.     '--- verify handle is valid
  25.     If Handle < 1 Then Status = 5: Exit Sub
  26.  
  27.     '--- use DDE Server
  28.     DBAccess "STATUSDBF," + Str$(Handle)
  29.  
  30.     '--- return values
  31.     If Status = 0 Then
  32.         ReDim Parsed(8)  As String
  33.         ParseString DBA_Data, ",", Parsed()
  34.         FileName$ = Parsed(1)
  35.         dbftype$ = Parsed(2)
  36.         DBTPtr = Val(Parsed(3))
  37.         NumRecs& = Val(Parsed(4))
  38.         NumFlds = Val(Parsed(5))
  39.         RecLen = Val(Parsed(6))
  40.         UpDate$ = Parsed(7)
  41.     End If
  42.  
  43. End Sub
  44.  
  45. Sub CloseDBF (Handle, Status, Mode)
  46.  
  47.     '
  48.     'Asks the DDE server to close a database file
  49.     '
  50.     
  51.     '--- verify handle is valid
  52.     If Handle < 1 Then Status = 5: Exit Sub
  53.  
  54.     '--- use DDE Server
  55.     DBAccess "CLOSEDBF," + Str$(Handle) + "," + Str$(Mode)     'use DDE
  56.     
  57.     '--- return value(s)
  58.     Status = DBA_Stat                       'set status
  59.     
  60. End Sub
  61.  
  62. Sub CloseNDX (Index, Status)
  63.     '
  64.     'Closes an index
  65.     '
  66.     
  67.     '--- verify handle is valid
  68.     If Index < 1 Then Status = 5: Exit Sub
  69.  
  70.     '--- use DDE Server
  71.     DBAccess "CLOSENDX," + Str$(Index)
  72.     
  73.     '--- return value(s)
  74.     Status = DBA_Stat                       'set status
  75.     
  76. End Sub
  77.  
  78. Sub CommitSTR (Handle, Status)
  79.  
  80.     '
  81.     'Used to write the database header to disk
  82.     '
  83.     
  84.     '--- verify handle is valid
  85.     If Handle < 1 Then Status = 5: Exit Sub
  86.  
  87.     '--- use DDE Server
  88.     DBAccess "CREATEDBF," + Str$(Handle)    'use DDE
  89.     
  90.     '--- return value(s)
  91.     Status = DBA_Stat                       'set status
  92.     
  93. End Sub
  94.  
  95. Sub CreateDBF (NewDbfName$, Handle, Fld$(), Mode, Status)
  96.  
  97.     '
  98.     'High level routine to create a then
  99.     'open a database. Combines the functions of
  100.     '
  101.     '   OpenDBF,
  102.     '   DefineSTR,
  103.     '   CommitSTR,
  104.     '   CloseDBF and
  105.     '   OpenDBF
  106.     '
  107.     'all in one routine.
  108.     '
  109.     'NOTE:  Database is defined based on array Flds$().
  110.     '       I strongly urge you to use DefineDatabase
  111.     '       to develop the Flds$() definition array
  112.     '       for you!
  113.     '
  114.     '
  115.  
  116.     '--- open file / erase exiting (if any)
  117.     OpenDBF Handle, Status, NewDbfName$, dbftype, 2
  118.     If Status Then Exit Sub
  119.  
  120.     '--- get no. fields
  121.     NumFlds = Val(Fld$(0, 0))
  122.     
  123.     '--- add fields
  124.     For FldNum = 1 To NumFlds
  125.         FldName$ = LTrim$(RTrim$(UCase$(Fld$(FldNum, 4))))
  126.         FldType$ = Left$(UCase$(Fld$(FldNum, 3)), 1)
  127.         FldLen = Val(Fld$(FldNum, 2))
  128.         Dec = Val(Fld$(FldNum, 1))
  129.         DefineSTR Handle, FldNum, FldName$, FldType$, FldLen, Dec
  130.     Next
  131.     
  132.     '--- save structure to file
  133.     CommitSTR Handle, Status
  134.  
  135.     '--- close it
  136.     CloseDBF Handle, Status, 0
  137.  
  138.     '--- open it up
  139.     OpenDBF Handle, Status, NewDbfName$, dbftype, Mode
  140.  
  141. End Sub
  142.  
  143. Sub DBAccess (CmdStr$)
  144.  
  145.     '
  146.     'Low-level routine which actually does the DDE
  147.     'exchange with the server.
  148.     '
  149.  
  150.     '--- check link
  151.     'If Not DBALinkUp() Then Exit Sub
  152.     
  153.     '--- send DDE command
  154.     DBA.db.LinkExecute CmdStr$
  155.     
  156.     '--- assign server response(s)
  157.     DBA_Data = DBA.db.Text
  158.     DBA_Mesg = DBA.message.Text
  159.     DBA_Stat = Val(DBA.errorstat.Text)
  160.     
  161. End Sub
  162.  
  163. Function DBALinkUp ()
  164.     
  165.     '
  166.     'Returns True (-1) if a client-server database link
  167.     'is up, False (0) if link is down.
  168.     '
  169.     
  170.     On Error GoTo LinkUpError
  171.     DBA.db.LinkExecute "Status"
  172.     DBALinkUp = -1
  173.     On Error GoTo 0
  174.     Exit Function
  175.  
  176. LinkUpError:
  177.     DBALinkUp = 0
  178.     On Error GoTo 0
  179.     Resume LinkUpErrorOut
  180. LinkUpErrorOut:
  181. End Function
  182.  
  183. Function DBALoaded ()
  184.     
  185.     '
  186.     'Checks to see if server is already running --
  187.     'use DBALinkUp to see if DDE channel is
  188.     'operational.
  189.     '
  190.  
  191.     On Error GoTo VBDBLoadedError
  192.     AppActivate "VBDB"
  193.     On Error GoTo 0
  194.     DBALoaded = -1
  195.     Exit Function
  196.  
  197. VBDBLoadedError:
  198.     On Error GoTo 0
  199.     DBALoaded = 0
  200.     Resume VBDBLoadedErrorOut
  201.  
  202. VBDBLoadedErrorOut:
  203.     
  204. End Function
  205.  
  206. Sub DefineSTR (Handle, FldNum, FldName$, FldType$, FldLen, Decimal)
  207.     
  208.     '
  209.     'Used to send information to the DDE server to
  210.     'define a database. It called once for each field.
  211.     '
  212.     
  213.     '--- verify handle is valid
  214.     If Handle < 1 Then Status = 5: Exit Sub
  215.     
  216.     '--- use DDE Server
  217.     DBAccess "DEFSTR," + Str$(Handle) + "," + Str$(FldNum) + "," + FldName$ + "," + FldType$ + "," + Str$(FldLen) + "," + Str$(Decimal)
  218.     
  219.     '--- return value(s)
  220.     Status = DBA_Stat
  221.     
  222. End Sub
  223.  
  224. Sub GetFLD (Handle, Status, FldNum, FldName$, FldData$, RecData$)
  225.  
  226.     '
  227.     'Returns a fields data from a database. FldNum has precedence
  228.     'over FldName$. FldNum indicates a field number to retrieve,
  229.     'if FldNum > 0. FldName$ indicates a field name to get, if FldNum
  230.     'is 0.
  231.     '
  232.     'Returns FldNum, FldName$, FldData$ and Status
  233.     '
  234.  
  235.     '--- verify handle is valid
  236.     If Handle < 1 Then Status = 5: Exit Sub
  237.  
  238.     '--- use DDE Server
  239.     DBAccess "GETFLD," + Str$(Handle) + "," + Str$(FldNum) + "," + FldName$ + "," + RecData$
  240.     
  241.     '--- return value(s)
  242.     FldData$ = DBA_Data
  243.     Status = DBA_Stat
  244.  
  245. End Sub
  246.  
  247. Sub GetFLDS (Handle, Status, NumFlds, Flds$(), RecNum&)
  248.     '
  249.     'Returns the number of fields in a record and
  250.     'parses the record into an array. Faster than
  251.     'Using GetREC and then using multiple GetFLD
  252.     'calls. Passed RecNum& -- returns Flds$() which contains
  253.     'all the fields data.
  254.     '
  255.     DBAccess "GETFLDS," + Str$(Handle) + "," + Str$(RecNum&)
  256.     Status = DBA_Stat: If Status > 0 Then Exit Sub
  257.     ParseString DBA_Data, ",", Flds$()
  258.     NumFlds = Val(Flds$(1))
  259.     For X = 1 To NumFlds - 1
  260.         Flds$(X) = Flds$(X + 1)
  261.     Next
  262. End Sub
  263.  
  264. Sub GetKEY (Index, Status, Key$, Record&, Mode)
  265.     
  266.     '
  267.     'Finds a key in an index
  268.     '
  269.     
  270.     '--- verify handle is valid
  271.     If Index < 1 Then Status = 5: Exit Sub
  272.     
  273.     '--- use DDE Server
  274.     DBAccess "GETKEY," + Str$(Index) + "," + Key$ + "," + Str$(Record&) + "," + Str$(Mode)
  275.  
  276.     '--- return value(s)
  277.     If DBA_Mesg = "key found" Then
  278.         Record& = DBA_Stat              'record no. passed via stat
  279.         DBA_Stat = 0                    'status is 0
  280.         Status = 0                      '   "    " "
  281.     Else
  282.         Status = DBA_Stat
  283.     End If
  284.  
  285.     Key$ = DBA_Data                 'actual key found
  286.     
  287. End Sub
  288.  
  289. Sub GetREC (Handle, Status, Rec&, RecData$)
  290.     
  291.     '
  292.     'Returns a DBF record from Handle in RecData$
  293.     '
  294.     
  295.     '--- verify handle is valid
  296.     If Handle < 1 Then Status = 5: Exit Sub
  297.  
  298.     '--- use DDE Server
  299.     DBAccess "GETREC," + Str$(Handle) + "," + Str$(Rec&)
  300.     
  301.     '--- return value(s)
  302.     RecData$ = DBA_Data
  303.     Status = DBA_Stat
  304.  
  305. End Sub
  306.  
  307. Function InCount (StringToCount As String, Item As String) As Integer
  308.  
  309.         '
  310.         'Counts up the number of times Item$ occurs in StringToCount$.
  311.         '
  312.         'Another interesting (to me) use of extra code to speed up a
  313.         'time-critical operation. Below, I use code short-circuiting
  314.         'techniques as well as loop counter modification and STEP
  315.         'options to make this FOR...NEXT loop the FASSSSTEST it can
  316.         'be!
  317.         '
  318.        
  319.         '--- Get these now to save time later
  320.         Reps = Len(StringToCount$)      'size of string
  321.         ItemLen = Len(Item$)               'use this to be able to find blocks
  322.  
  323.         '--- go for it
  324.         For X = 1 To Reps Step ItemLen     'STEP Item for speed!
  325.           '--- look for Item$
  326.           OffSet = InStr(X, StringToCount$, Item$)
  327.           If OffSet Then